package com.ioftv.service.base;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ioftv.entity.SysUser;
import com.ioftv.util.RolePermissionUtil;
import com.ioftv.util.UserContextUtil;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;

/**
 * 基础服务类，提供数据隔离功能
 * @param <M> Mapper类型
 * @param <T> 实体类型
 */
public class BaseService<M extends BaseMapper<T>, T> extends ServiceImpl<M, T> {
    
    /**
     * 获取当前用户ID
     * @return 用户ID
     */
    protected Long getCurrentUserId() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            HttpServletRequest request = attributes.getRequest();
            return UserContextUtil.getCurrentUserId(request);
        }
        return null;
    }
    
    /**
     * 获取当前用户角色
     * @return 用户角色
     */
    protected String getCurrentUserRole() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            HttpServletRequest request = attributes.getRequest();
            return UserContextUtil.getCurrentUserRole(request);
        }
        return null;
    }
    
    /**
     * 创建带用户条件的查询包装器
     * @return 查询包装器
     */
    protected LambdaQueryWrapper<T> createUserQueryWrapper() {
        LambdaQueryWrapper<T> queryWrapper = new LambdaQueryWrapper<>();
        // 管理员可以访问所有数据
        if (!RolePermissionUtil.ROLE_ADMIN.equals(getCurrentUserRole())) {
            addUserCondition(queryWrapper);
        }
        return queryWrapper;
    }
    
    /**
     * 创建带用户条件的更新包装器
     * @return 更新包装器
     */
    protected LambdaUpdateWrapper<T> createUserUpdateWrapper() {
        LambdaUpdateWrapper<T> updateWrapper = new LambdaUpdateWrapper<>();
        // 管理员可以更新所有数据
        if (!RolePermissionUtil.ROLE_ADMIN.equals(getCurrentUserRole())) {
            addUserCondition(updateWrapper);
        }
        return updateWrapper;
    }
    
    /**
     * 添加用户条件到查询包装器
     * @param queryWrapper 查询包装器
     */
    protected void addUserCondition(LambdaQueryWrapper<T> queryWrapper) {
        // 子类需要重写此方法来添加具体的用户条件
    }
    
    /**
     * 添加用户条件到更新包装器
     * @param updateWrapper 更新包装器
     */
    protected void addUserCondition(LambdaUpdateWrapper<T> updateWrapper) {
        // 子类需要重写此方法来添加具体的用户条件
    }
    
    /**
     * 设置实体的用户ID
     * @param entity 实体对象
     */
    protected void setEntityUserId(T entity) {
        // 子类需要重写此方法来设置实体的用户ID
    }
    
    /**
     * 保存实体前的处理
     * @param entity 实体对象
     * @return 是否继续保存
     */
    @Override
    public boolean save(T entity) {
        // 设置用户ID
        setEntityUserId(entity);
        return super.save(entity);
    }
    
    /**
     * 更新实体前的处理
     * @param entity 实体对象
     * @return 是否继续更新
     */
    @Override
    public boolean updateById(T entity) {
        // 设置用户ID
        setEntityUserId(entity);
        return super.updateById(entity);
    }
}